home *** CD-ROM | disk | FTP | other *** search
/ Clickx 47 / Clickx 47.iso / assets / software / Miro_Installer.exe / Miro_Downloader.exe / selection.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2008-01-10  |  20.0 KB  |  710 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''Handle selection.'''
  5. from copy import copy
  6. import app
  7. import database
  8. import eventloop
  9. import folder
  10. import config
  11. import prefs
  12. import guide
  13. import item
  14. import tabs
  15. import playlist
  16. import feed
  17. import views
  18. import indexes
  19. import template
  20. import util
  21. from gtcache import gettext as _
  22.  
  23. def getID(obj):
  24.     '''Gets an ID to use for an object.  For tabs, this is the object ID that
  25.     maps to the tab.  For other objects this is the actual DDBObject ID.'''
  26.     if isinstance(obj, tabs.Tab):
  27.         return obj.objID()
  28.     else:
  29.         return obj.getID()
  30.  
  31.  
  32. class SelectionArea(object):
  33.     '''Represents an area that holds a selection.  Currently we have 2
  34.     SelectionAreas, the tab list and the item list.  SelectionAreas hold
  35.     several database views, for instance the tab list contains
  36.     views.guideTabs, views.staticTabs, views.feedTabs and views.playlistTabs.
  37.     All the items selected in an area must be in a single view.
  38.  
  39.     Member variables:
  40.  
  41.     currentView -- The view that items are currently selected in, or None if
  42.         there are no items selected.
  43.     currentSelection -- set of object IDs that are currently selected.
  44.     '''
  45.     
  46.     def __init__(self, selectionHandler):
  47.         self.currentSelection = set()
  48.         self.currentView = None
  49.         self.handler = selectionHandler
  50.  
  51.     
  52.     def switchView(self, view):
  53.         if self.currentView == view:
  54.             return None
  55.         
  56.         if self.currentView:
  57.             self.clearSelection()
  58.         
  59.         self.currentView = view
  60.         self.currentView.addRemoveCallback(self.onRemove)
  61.         self.currentView.addAddCallback(self.onAdd)
  62.         self.currentView.addViewUnlinkCallback(self.onViewUnlinked)
  63.  
  64.     
  65.     def selectItem(self, view, id):
  66.         self.switchView(view)
  67.         obj = view.getObjectByID(id)
  68.         self.currentSelection.add(id)
  69.         obj.setSelected(True)
  70.  
  71.     
  72.     def deselectItem(self, view, id):
  73.         if view != self.currentView:
  74.             raise ValueError('view != current view in deselectItem()')
  75.         
  76.         obj = view.getObjectByID(id)
  77.         self.currentSelection.remove(id)
  78.         obj.setSelected(False)
  79.  
  80.     
  81.     def isSelected(self, view, id):
  82.         if self.currentView == view:
  83.             pass
  84.         return id in self.currentSelection
  85.  
  86.     
  87.     def toggleItemSelect(self, view, id):
  88.         self.switchView(view)
  89.         if id in self.currentSelection:
  90.             self.deselectItem(view, id)
  91.         else:
  92.             self.selectItem(view, id)
  93.  
  94.     
  95.     def clearSelection(self):
  96.         '''Clears the current selection.'''
  97.         for obj in self.getObjects():
  98.             obj.setSelected(False)
  99.         
  100.         self.currentSelection = set()
  101.         if self.currentView is not None:
  102.             self.currentView.removeRemoveCallback(self.onRemove)
  103.             self.currentView.removeAddCallback(self.onAdd)
  104.             self.currentView = None
  105.         
  106.  
  107.     
  108.     def selectAll(self):
  109.         '''Select all objects in the current View.'''
  110.         view = self.currentView
  111.         if view:
  112.             for obj in view:
  113.                 if obj.getID not in self.currentSelection:
  114.                     self.selectItem(view, obj.getID())
  115.                     continue
  116.             
  117.         
  118.  
  119.     
  120.     def calcExtendRange(self, view, id):
  121.         idIsBefore = False
  122.         gotFirst = False
  123.         firstID = None
  124.         lastID = None
  125.         for obj in view:
  126.             objID = getID(obj)
  127.             if objID == id and not gotFirst:
  128.                 idIsBefore = True
  129.             
  130.             if objID in self.currentSelection:
  131.                 if not gotFirst:
  132.                     firstID = objID
  133.                     gotFirst = True
  134.                 
  135.                 lastID = objID
  136.                 continue
  137.         
  138.         if firstID is None or lastID is None:
  139.             raise AssertionError("Couldn't find my selected IDs")
  140.         
  141.         if idIsBefore:
  142.             return (id, lastID)
  143.         else:
  144.             return (firstID, id)
  145.  
  146.     
  147.     def extendSelection(self, view, id):
  148.         '''Extends the selection in response to a shift-select.  If id is on
  149.         top of the current selection, we will select everything between the id
  150.         and the last selected item.  If id is below it or in the middle, we
  151.         will select between the first selected item and id.  
  152.         '''
  153.         self.switchView(view)
  154.         if len(self.currentSelection) == 0:
  155.             return self.selectItem(view, id)
  156.         
  157.         (firstID, lastID) = self.calcExtendRange(view, id)
  158.         self.selectBetween(view, firstID, lastID)
  159.  
  160.     
  161.     def selectBetween(self, view, firstID, lastID):
  162.         '''Select all items in view between firstID and lastID.'''
  163.         self.switchView(view)
  164.         selecting = False
  165.         toSelect = []
  166.         for obj in view:
  167.             id = getID(obj)
  168.             if selecting and id not in self.currentSelection:
  169.                 toSelect.append(id)
  170.             
  171.             if id == firstID:
  172.                 selecting = True
  173.                 if id not in self.currentSelection:
  174.                     toSelect.append(id)
  175.                 
  176.             
  177.             if id == lastID:
  178.                 break
  179.                 continue
  180.         
  181.         for id in toSelect:
  182.             self.selectItem(view, id)
  183.         
  184.  
  185.     
  186.     def onRemove(self, obj, id):
  187.         if id in self.currentSelection:
  188.             self.currentSelection.remove(id)
  189.             if obj.idExists():
  190.                 obj.setSelected(False)
  191.             
  192.         
  193.  
  194.     
  195.     def setObjectsActive(self, newValue):
  196.         '''Iterate through all selected objects and call setActive on them,
  197.         passing in newValue.
  198.         '''
  199.         for obj in self.getObjects():
  200.             obj.setActive(newValue)
  201.         
  202.  
  203.     
  204.     def onAdd(self, obj, id):
  205.         if obj.getSelected() and id not in self.currentSelection:
  206.             self.currentSelection.add(id)
  207.         
  208.  
  209.     
  210.     def onViewUnlinked(self):
  211.         self.clearSelection()
  212.  
  213.     
  214.     def getTypesDetailed(self):
  215.         """Get the type of objects that are selected.  
  216.  
  217.         Returns a set, containing all the type of objects selected.  The
  218.         members will be one of the following:
  219.  
  220.         'item', 'downloadeditem' 'playlisttab', playlistfoldertab,
  221.         'channeltab', 'channelfoldertab', 'guidetab', 'addedguidetab',
  222.         'statictab'.
  223.  
  224.         """
  225.         types = set()
  226.         for obj in self.getObjects():
  227.             if isinstance(obj, item.Item):
  228.                 if obj.isDownloaded():
  229.                     newType = 'downloadeditem'
  230.                 else:
  231.                     newType = 'item'
  232.             elif isinstance(obj, tabs.Tab):
  233.                 objClass = obj.obj.__class__
  234.                 if objClass == playlist.SavedPlaylist:
  235.                     newType = 'playlisttab'
  236.                 elif objClass == folder.PlaylistFolder:
  237.                     newType = 'playlistfoldertab'
  238.                 elif objClass == feed.Feed:
  239.                     newType = 'channeltab'
  240.                 elif objClass == folder.ChannelFolder:
  241.                     newType = 'channelfoldertab'
  242.                 elif objClass == guide.ChannelGuide:
  243.                     if obj.obj.getDefault():
  244.                         newType = 'guidetab'
  245.                     else:
  246.                         newType = 'addedguidetab'
  247.                 elif objClass == tabs.StaticTab:
  248.                     newType = 'statictab'
  249.                 else:
  250.                     raise ValueError('Bad selected tab type: %s' % obj.obj)
  251.             else:
  252.                 raise ValueError('Bad selected object type: %s' % obj)
  253.             types.add(newType)
  254.         
  255.         self.simplifyTypes(types)
  256.         return types
  257.  
  258.     
  259.     def simplifyTypes(self, types):
  260.         if len(types) == 0:
  261.             return None
  262.         elif types.issubset(set([
  263.             'item',
  264.             'downloadeditem'])):
  265.             return 'item'
  266.         elif types.issubset(set([
  267.             'playlistfoldertab',
  268.             'playlisttab'])):
  269.             return 'playlisttab'
  270.         elif types.issubset(set([
  271.             'channelfoldertab',
  272.             'channeltab'])):
  273.             return 'channeltab'
  274.         elif len(types) == 1:
  275.             for type in types:
  276.                 return type
  277.             
  278.         else:
  279.             raise ValueError('Multiple types selected: %s' % types)
  280.  
  281.     
  282.     def getType(self):
  283.         '''Get the simplified version of the type of objects that are
  284.         selected.  getType() works like getTypesDetailed(), but it just
  285.         returns one value.  It doesn\'t differentiate between playlists and
  286.         playlist folders, and items and downloaded items for example.
  287.  
  288.         The return value will be one of
  289.  
  290.         "item", "playlisttab", "channeltab", \'guidetab\', \'addedguidetab\',
  291.         \'statictab\', or None if nothing is selected.  
  292.  
  293.         '''
  294.         return self.simplifyTypes(self.getTypesDetailed())
  295.  
  296.     
  297.     def getObjects(self):
  298.         view = self.currentView
  299.         return [ view.getObjectByID(id) for id in self.currentSelection ]
  300.  
  301.     
  302.     def firstBeforeSelection(self, iterator):
  303.         '''Go through iterator and find the first item that is selected.
  304.         Returns the item immediately before that one.
  305.  
  306.         Returns None if the first item in iterator is selected, or no items
  307.         are selected.
  308.         '''
  309.         lastItem = None
  310.         for item in iterator:
  311.             if item.getID() in self.currentSelection:
  312.                 return lastItem
  313.             
  314.             lastItem = item
  315.         
  316.         return None
  317.  
  318.     
  319.     def firstAfterSelection(self, iterator):
  320.         '''Like firstBeforeSelection, but returns the first item following the
  321.         last selected item in iterator.
  322.         '''
  323.         retval = None
  324.         lastSelected = False
  325.         for item in iterator:
  326.             if item.getID() in self.currentSelection:
  327.                 lastSelected = True
  328.                 continue
  329.             if lastSelected:
  330.                 lastSelected = False
  331.                 retval = item
  332.                 continue
  333.         
  334.         return retval
  335.  
  336.  
  337.  
  338. class TabSelectionArea(SelectionArea):
  339.     '''Selection area for the tablist.  This has a couple special cases to
  340.     ensure that we always have at least one tab selected.
  341.     '''
  342.     
  343.     def selectItem(self, view, id):
  344.         SelectionArea.selectItem(self, view, id)
  345.         self.moveCursorToSelection()
  346.  
  347.     
  348.     def deselectItem(self, view, id):
  349.         SelectionArea.deselectItem(self, view, id)
  350.         self.moveCursorToSelection()
  351.  
  352.     
  353.     def moveCursorToSelection(self):
  354.         for id in self.currentSelection:
  355.             self.currentView.moveCursorToID(id)
  356.         
  357.  
  358.     
  359.     def toggleItemSelect(self, view, id):
  360.         if self.currentSelection == set([
  361.             id]):
  362.             return None
  363.         else:
  364.             return SelectionArea.toggleItemSelect(self, view, id)
  365.  
  366.     
  367.     def onRemove(self, obj, id):
  368.         SelectionArea.onRemove(self, obj, id)
  369.         eventloop.addUrgentCall(self.checkNoTabsSelected, 'checkNoTabsSelected')
  370.  
  371.     
  372.     def checkNoTabsSelected(self):
  373.         if len(self.currentSelection) == 0:
  374.             prevTab = self.currentView.cur()
  375.             if prevTab is None:
  376.                 prevTab = self.currentView.getNext()
  377.             
  378.             if prevTab is None:
  379.                 self.selectFirstTab()
  380.             else:
  381.                 self.selectItem(self.currentView, prevTab.objID())
  382.             self.handler.displayCurrentTabContent()
  383.         
  384.  
  385.     
  386.     def selectFirstTab(self):
  387.         if config.get(prefs.OPEN_CHANNEL_ON_STARTUP) is not None:
  388.             view = views.feeds.filterWithIndex(indexes.feedsByURL, unicode(config.get(prefs.OPEN_CHANNEL_ON_STARTUP)))
  389.             if len(view) > 0:
  390.                 self.selectItem(views.allTabs, view[0].getID())
  391.                 self.handler.displayCurrentTabContent()
  392.                 view.unlink()
  393.                 return None
  394.             else:
  395.                 view.unlink()
  396.         
  397.         if config.get(prefs.OPEN_FOLDER_ON_STARTUP) is not None:
  398.             view = views.channelFolders.filterWithIndex(indexes.foldersByTitle, unicode(config.get(prefs.OPEN_FOLDER_ON_STARTUP)))
  399.             if len(view) > 0:
  400.                 self.selectItem(views.allTabs, view[0].getID())
  401.                 self.handler.displayCurrentTabContent()
  402.                 view.unlink()
  403.                 return None
  404.             else:
  405.                 view.unlink()
  406.         
  407.         views.guideTabs.resetCursor()
  408.         guide = views.guideTabs.getNext()
  409.         self.selectItem(views.guideTabs, guide.objID())
  410.         self.handler.displayCurrentTabContent()
  411.  
  412.     
  413.     def isFolderSelected(self):
  414.         '''Returns if a channel/playlist folder is selected.'''
  415.         for tab in self.getObjects():
  416.             if isinstance(tab.obj, folder.FolderBase):
  417.                 return True
  418.                 continue
  419.         
  420.         return False
  421.  
  422.  
  423.  
  424. class SelectionHandler(object):
  425.     '''Handles selection for Democracy.
  426.  
  427.     Attributes:
  428.  
  429.     tabListSelection -- SelectionArea for the tab list
  430.     itemListSelection -- SelectionArea for the item list
  431.     tabListActive -- does the tabListSelection the have the "active"
  432.         selection?  In other words, is that the one that was clicked on last.
  433.     '''
  434.     
  435.     def __init__(self):
  436.         self.tabListSelection = TabSelectionArea(self)
  437.         self.itemListSelection = SelectionArea(self)
  438.         self.lastDisplay = None
  439.         self.tabListActive = True
  440.  
  441.     
  442.     def getSelectionForArea(self, area):
  443.         if area == 'tablist':
  444.             return self.tabListSelection
  445.         elif area == 'itemlist':
  446.             return self.itemListSelection
  447.         else:
  448.             raise ValueError('Unknown area: %s' % area)
  449.  
  450.     
  451.     def isSelected(self, area, view, id):
  452.         return self.getSelectionForArea(area).isSelected(view, id)
  453.  
  454.     
  455.     def selectItem(self, area, view, id, shiftSelect, controlSelect, displayTabContent = True):
  456.         selection = self.getSelectionForArea(area)
  457.         
  458.         try:
  459.             selectedObj = view.getObjectByID(id)
  460.         except database.ObjectNotFoundError:
  461.             return None
  462.  
  463.         if isinstance(selectedObj, tabs.Tab) and selectedObj.type in ('statictab', 'guide'):
  464.             controlSelect = shiftSelect = False
  465.         
  466.         if controlSelect:
  467.             selection.toggleItemSelect(view, id)
  468.         elif shiftSelect:
  469.             selection.extendSelection(view, id)
  470.         else:
  471.             selection.clearSelection()
  472.             selection.selectItem(view, id)
  473.         if area == 'itemlist':
  474.             self.setTabListActive(False)
  475.             self.updateMenus()
  476.         else:
  477.             self.setTabListActive(True)
  478.             if displayTabContent:
  479.                 self.displayCurrentTabContent()
  480.             
  481.  
  482.     
  483.     def setTabListActive(self, value):
  484.         self.tabListActive = value
  485.         self.tabListSelection.setObjectsActive(value)
  486.         self.itemListSelection.setObjectsActive(not value)
  487.  
  488.     
  489.     def calcSelection(self, area, sourceID):
  490.         '''Calculate the selection, given the ID of an object that was clicked
  491.         on.  If sourceID is in the current selection, this will all the
  492.         objects in the current selection, otherwise it will be only the object
  493.         that corresponds to sourceID.  
  494.         '''
  495.         selection = self.getSelectionForArea(area)
  496.         if sourceID in selection.currentSelection:
  497.             return set(selection.currentSelection)
  498.         else:
  499.             return set([
  500.                 sourceID])
  501.  
  502.     
  503.     def selectFirstTab(self):
  504.         self.tabListSelection.selectFirstTab()
  505.  
  506.     
  507.     def selectTabByTemplateBase(self, tabTemplateBase, displayTabContent = True):
  508.         tabViews = [
  509.             views.guideTabs,
  510.             views.staticTabs,
  511.             views.feedTabs,
  512.             views.playlistTabs]
  513.         for view in tabViews:
  514.             for tab in view:
  515.                 if tab.tabTemplateBase == tabTemplateBase:
  516.                     self.selectItem('tablist', view, tab.objID(), shiftSelect = False, controlSelect = False, displayTabContent = displayTabContent)
  517.                     return None
  518.                     continue
  519.             
  520.         
  521.  
  522.     
  523.     def selectTabByObject(self, obj, displayTabContent = True):
  524.         channelTabOrder = util.getSingletonDDBObject(views.channelTabOrder)
  525.         playlistTabOrder = util.getSingletonDDBObject(views.playlistTabOrder)
  526.         tabViews = [
  527.             views.guideTabs,
  528.             views.staticTabs,
  529.             channelTabOrder.getView(),
  530.             playlistTabOrder.getView()]
  531.         for view in tabViews:
  532.             for tab in view:
  533.                 if tab.obj is obj:
  534.                     self.selectItem('tablist', view, tab.objID(), shiftSelect = False, controlSelect = False, displayTabContent = displayTabContent)
  535.                     return None
  536.                     continue
  537.             
  538.         
  539.  
  540.     
  541.     def _chooseDisplayForCurrentTab(self):
  542.         tls = self.tabListSelection
  543.         frame = app.controller.frame
  544.         if len(tls.currentSelection) == 0:
  545.             raise AssertionError('No tabs selected')
  546.         elif len(tls.currentSelection) == 1:
  547.             for id in tls.currentSelection:
  548.                 tab = tls.currentView.getObjectByID(id)
  549.                 return app.TemplateDisplay(tab.contentsTemplate, tab.templateState, frameHint = frame, areaHint = frame.mainDisplay, id = tab.obj.getID())
  550.             
  551.         else:
  552.             foldersSelected = False
  553.             type = tls.getType()
  554.             if type == 'playlisttab':
  555.                 templateName = 'multi-playlist'
  556.             elif type == 'channeltab':
  557.                 templateName = 'multi-channel'
  558.             
  559.             selectedChildren = 0
  560.             selectedFolders = 0
  561.             containedChildren = 0
  562.             for tab in self.getSelectedTabs():
  563.                 if isinstance(tab.obj, folder.FolderBase):
  564.                     selectedFolders += 1
  565.                     view = tab.obj.getChildrenView()
  566.                     containedChildren += view.len()
  567.                     for child in view:
  568.                         if child.getID() in tls.currentSelection:
  569.                             selectedChildren -= 1
  570.                             continue
  571.                     
  572.                 selectedChildren += 1
  573.             
  574.             return app.TemplateDisplay(templateName, 'default', frameHint = frame, areaHint = frame.mainDisplay, selectedFolders = selectedFolders, selectedChildren = selectedChildren, containedChildren = containedChildren)
  575.  
  576.     
  577.     def updateMenus(self):
  578.         tabTypes = self.tabListSelection.getTypesDetailed()
  579.         if tabTypes.issubset(set([
  580.             'guidetab',
  581.             'addedguidetab'])):
  582.             guideURL = self.getSelectedTabs()[0].obj.getURL()
  583.         else:
  584.             guideURL = None
  585.         multiple = len(self.tabListSelection.currentSelection) > 1
  586.         actionGroups = { }
  587.         states = {
  588.             'plural': [],
  589.             'folders': [],
  590.             'folder': [] }
  591.         is_playlistlike = tabTypes.issubset(set([
  592.             'playlisttab',
  593.             'playlistfoldertab']))
  594.         is_channellike = tabTypes.issubset(set([
  595.             'channeltab',
  596.             'channelfoldertab',
  597.             'addedguidetab']))
  598.         is_channel = tabTypes.issubset(set([
  599.             'channeltab',
  600.             'channelfoldertab']))
  601.         if len(tabTypes) == 1:
  602.             if multiple:
  603.                 if 'playlisttab' in tabTypes:
  604.                     states['plural'].append('RemovePlaylists')
  605.                 elif 'playlistfoldertab' in tabTypes:
  606.                     states['folders'].append('RemovePlaylists')
  607.                 elif 'channeltab' in tabTypes:
  608.                     states['plural'].append('RemoveChannels')
  609.                 elif 'channelfoldertab' in tabTypes:
  610.                     states['folders'].append('RemoveChannels')
  611.                 elif 'addedguidetab' in tabTypes:
  612.                     states['plural'].append('ChannelGuides')
  613.                 
  614.             elif 'playlisttab' in tabTypes:
  615.                 pass
  616.             elif 'playlistfoldertab' in tabTypes:
  617.                 states['folder'].append('RemovePlaylists')
  618.             elif 'channeltab' in tabTypes:
  619.                 pass
  620.             elif 'channelfoldertab' in tabTypes:
  621.                 states['folder'].append('RemoveChannels')
  622.             elif 'addedguidetab' in tabTypes:
  623.                 pass
  624.             
  625.         
  626.         if multiple and is_channel:
  627.             states['plural'].append('UpdateChannels')
  628.         
  629.         if is_channellike:
  630.             pass
  631.         actionGroups['ChannelLikeSelected'] = not multiple
  632.         actionGroups['ChannelLikesSelected'] = is_channellike
  633.         if is_playlistlike:
  634.             pass
  635.         actionGroups['PlaylistLikeSelected'] = not multiple
  636.         actionGroups['PlaylistLikesSelected'] = is_playlistlike
  637.         if tabTypes.issubset(set([
  638.             'channeltab'])):
  639.             pass
  640.         actionGroups['ChannelSelected'] = not multiple
  641.         actionGroups['ChannelsSelected'] = tabTypes.issubset(set([
  642.             'channeltab',
  643.             'channelfoldertab']))
  644.         if tabTypes.issubset(set([
  645.             'channelfoldertab'])):
  646.             pass
  647.         actionGroups['ChannelFolderSelected'] = not multiple
  648.         actionGroups['VideoSelected'] = False
  649.         actionGroups['VideosSelected'] = False
  650.         actionGroups['VideoPlayable'] = False
  651.         videoFileName = None
  652.         if 'downloadeditem' in self.itemListSelection.getTypesDetailed():
  653.             actionGroups['VideosSelected'] = True
  654.             actionGroups['VideoPlayable'] = True
  655.             if len(self.itemListSelection.currentSelection) == 1:
  656.                 actionGroups['VideoSelected'] = True
  657.                 item = self.itemListSelection.getObjects()[0]
  658.                 videoFileName = item.getVideoFilename()
  659.             else:
  660.                 states['plural'].append('RemoveVideos')
  661.         
  662.         app.controller.frame.onSelectedTabChange(states, actionGroups, guideURL, videoFileName)
  663.  
  664.     
  665.     def displayCurrentTabContent(self):
  666.         frame = app.controller.frame
  667.         mainDisplay = frame.getDisplay(frame.mainDisplay)
  668.         if mainDisplay and hasattr(mainDisplay, 'templateName') and mainDisplay.templateName == 'channel':
  669.             tls = self.tabListSelection
  670.             if len(tls.currentSelection) == 1:
  671.                 for id in tls.currentSelection:
  672.                     tab = tls.currentView.getObjectByID(id)
  673.                     if tab.contentsTemplate == 'channel':
  674.                         newId = int(tab.obj.getID())
  675.                         self.itemListSelection.clearSelection()
  676.                         self.updateMenus()
  677.                         if mainDisplay.kargs['id'] != newId:
  678.                             mainDisplay.reInit(id = newId)
  679.                         
  680.                         return None
  681.                         continue
  682.                 
  683.             
  684.         
  685.         newDisplay = self._chooseDisplayForCurrentTab()
  686.         if self.lastDisplay and newDisplay == self.lastDisplay and self.lastDisplay is mainDisplay and newDisplay.templateName != 'guide':
  687.             newDisplay.unlink()
  688.             return None
  689.         
  690.         self.itemListSelection.clearSelection()
  691.         self.updateMenus()
  692.         template.queueSelectDisplay(frame, newDisplay, frame.mainDisplay)
  693.         self.lastDisplay = newDisplay
  694.  
  695.     
  696.     def isTabSelected(self, tab):
  697.         return tab.objID() in self.tabListSelection.currentSelection
  698.  
  699.     
  700.     def getSelectedTabs(self):
  701.         '''Return a list of the currently selected Tabs. '''
  702.         return self.tabListSelection.getObjects()
  703.  
  704.     
  705.     def getSelectedItems(self):
  706.         '''Return a list of the currently selected items. '''
  707.         return self.itemListSelection.getObjects()
  708.  
  709.  
  710.